home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
CUGUK
/
COMMS
/
C011.ZIP
/
ARCSRC
/
MARC.MAC
< prev
next >
Wrap
Text File
|
1990-01-19
|
8KB
|
204 lines
/* MARC - Archive merge utility
$define(tag,$$segment(@1,$$index(@1,=)+1))#
$define(version,Version $tag(
TED_VERSION DB =5.01), created on $tag(
TED_DATE DB =02/03/86) at $tag(
TED_TIME DB =23:03:03))#
$undefine(tag)#
$version
(C) COPYRIGHT 1985 by System Enhancement Associates; ALL RIGHTS RESERVED
By: Thom Henderson
Description:
This program is used to "merge" archives. That is, to move
files from one archive to another with no data conversion.
Please refer to the ARC source for a description of archives
and archive formats.
Instructions:
Run this program with no arguments for complete instructions.
Language:
Computer Innovations Optimizing C86
*/
#include <stdio.h>
#include "arc.h"
FILE *src; /* source archive */
char srcname[$strlen]; /* source archive name */
main(nargs,arg) /* system entry point */
int nargs; /* number of arguments */
char *arg[]; /* pointers to arguments */
{
char *makefnam(); /* filename fixup routine */
static char *allf[] = {"*.*"}; /* phony arg to merge all files */
if(nargs<3)
{ printf("MARC - Archive merger, $version\n");
printf("(C) COPYRIGHT 1985 by System Enhancement Associates;");
printf(" ALL RIGHTS RESERVED\n\n");
printf("Please refer all inquiries to:\n\n");
printf(" System Enhancement Associates\n");
printf(" 21 New Street, Wayne NJ 07470\n\n");
printf("You may copy and distribute this program freely,");
printf(" provided that:\n");
printf(" 1) No fee is charged for such copying and");
printf(" distribution, and\n");
printf(" 2) It is distributed ONLY in its original,");
printf(" unmodified state.\n\n");
printf("If you like this program, and find it of use, then your");
printf(" contribution will\n");
printf("be appreciated. You may not use this product in a");
printf(" commercial environment\n");
printf("or a governmental organization without paying a license");
printf(" fee of $35. Site\n");
printf("licenses and commercial distribution licenses are");
printf(" available. A program\n");
printf("disk and printed documentation are available for $50.\n");
printf("\nIf you fail to abide by the terms of this license, ");
printf(" then your conscience\n");
printf("will haunt you for the rest of your life.\n\n");
printf("Usage: MARC <tgtarc> <srcarc> [<filename> . . .]\n");
printf("Where: <tgtarc> is the archive to add files to,\n");
printf(" <srcarc> is the archive to get files from, and\n");
printf(" <filename> is zero or more file names to get.\n");
return 1;
}
makefnam(arg[1],".ARC",arcname); /* fix up archive names */
makefnam(arg[2],".ARC",srcname);
makefnam(arg[1],".$$$$",newname);
upper(arcname); upper(srcname); upper(newname);
arc = fopen(arcname,"rb"); /* open the archives */
if(!(src=fopen(srcname,"rb")))
abort("Cannot read source archive %s",srcname);
if(!(new=fopen(newname,"wb")))
abort("Cannot create new archive %s",newname);
if(!arc)
printf("Creating new archive %s\n",arcname);
if(nargs==3)
merge(1,allf); /* merge all files */
else merge(nargs-3,&arg[3]); /* merge selected files */
if(arc) fclose(arc); /* close the archives */
fclose(src);
setstamp(new,arcdate,arctime); /* new arc matches newest file */
fclose(new);
if(arc) /* make the switch */
if(unlink(arcname))
abort("Unable to delete old copy of %s",arcname);
if(rename(newname,arcname))
abort("Unable to rename %s to %s",newname,arcname);
return nerrs;
}
merge(nargs,arg) /* merge two archives */
int nargs; /* number of filename templates */
char *arg[]; /* pointers to names */
{
struct heads srch; /* source archive header */
struct heads arch; /* target archive header */
int gotsrc, gotarc; /* archive entry versions (0=end) */
int copy; /* true to copy file from source */
int n; /* index */
gotsrc = gethdr(src,&srch); /* get first source file */
gotarc = gethdr(arc,&arch); /* get first target file */
while(gotsrc || gotarc) /* while more to merge */
{ if(strcmp(srch.name,arch.name)>0)
{ copyfile(arc,&arch,gotarc);
gotarc = gethdr(arc,&arch);
}
else if(strcmp(srch.name,arch.name)<0)
{ copy = 0;
for(n=0; n<nargs; n++)
{ if(match(srch.name,arg[n]))
{ copy = 1;
break;
}
}
if(copy) /* select source or target */
{ printf("Adding file: %s\n",srch.name);
copyfile(src,&srch,gotsrc);
}
else fseek(src,srch.size,1);
gotsrc = gethdr(src,&srch);
}
else /* duplicate names */
{ copy = 0;
{ if((srch.date>arch.date)
|| (srch.date==arch.date && srch.time>arch.time))
{ for(n=0; n<nargs; n++)
{ if(match(srch.name,arg[n]))
{ copy = 1;
break;
}
}
}
}
if(copy) /* select source or target */
{ printf("Updating file: %s\n",srch.name);
copyfile(src,&srch,gotsrc);
gotsrc = gethdr(src,&srch);
if(gotarc)
{ fseek(arc,arch.size,1);
gotarc = gethdr(arc,&arch);
}
}
else
{ copyfile(arc,&arch,gotarc);
gotarc = gethdr(arc,&arch);
if(gotsrc)
{ fseek(src,srch.size,1);
gotsrc = gethdr(src,&srch);
}
}
}
}
hdrver = 0; /* end of archive marker */
writehdr(&arch,new); /* mark the end of the archive */
}
int gethdr(f,hdr) /* special read header for merge */
FILE *f; /* file to read from */
struct heads *hdr; /* storage for header */
{
char *i = hdr->name; /* string index */
int n; /* index */
for(n=0; n<$fnlen; n++) /* fill name field */
*i++ = 0176; /* impossible high value */
*--i = '\0'; /* properly end the name */
hdrver = 0; /* reset header version */
if(readhdr(hdr,f)) /* use normal reading logic */
return hdrver; /* return the version */
else return 0; /* or fake end of archive */
}
copyfile(f,hdr,ver) /* copy a file from an archive */
FILE *f; /* archive to copy from */
struct heads *hdr; /* header data for file */
int ver; /* header version */
{
hdrver = ver; /* set header version */
writehdr(hdr,new); /* write out the header */
filecopy(f,new,hdr->size); /* copy over the data */
}